引用与传值

//person.M
//  --------   computer属性的存在时间
//------------ person的存在时间   

#import "Person.h"
#import "Computer.h"
#import "ClassRoom.h"
@implementation Person
- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"person init");

        _computer = [[Computer alloc]init];
//        _computer.keyword = self.delegate.keyword;
        _computer.delegate = self;
    }
    return self;
}

+ (instancetype)personWithComputer:(Computer *)computer
{
    Person *per = [[self alloc]init];
    per.computer = computer;
    per.computer.delegate = per;
//    per.point.x = 5;//

//    [per autorelease];//在方法中加入autorelease,使其内存管制无误,有且仅有一个
    return [per autorelease];
}

- (void)walkToClassRoom:(ClassRoom *)classRoom
{
    [classRoom.persons addObject:self];
}

- (void)dealloc
{
    [_computer release];
    [super dealloc];
}

@end
//person.h

#import <Foundation/Foundation.h>

@class Computer;
@class ClassRoom;

@interface Person : NSObject
//{
//    Computer *_computer;
//}
@property (strong, nonatomic) NSString      *name;
@property (strong, nonatomic) Computer      *computer;
//strong: 在使用属性的过程中,保证对象存在
//retain:
@property (strong, nonatomic) NSString      *keyword;

//建立一个便利构造,通过电脑对象初始化Person
+ (instancetype)personWithComputer:(Computer *)computer;
- (void)walkToClassRoom:(ClassRoom *)classRoom;
@end
//computer.m
#import "Computer.h"

@implementation Computer
- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"computer init");
    }
    return self;
}
//循环引用
- (void)dealloc
{
    self.delegate = nil;//研究知识点:当owner是strong属性和assign属性的时候,分别有什么作用

    [super dealloc];
}

@end
//person.h
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Computer : NSObject
@property (assign, nonatomic)Person     *delegate;//上一级
//assign: 弱引用,不增加引用计数,保证对象即时释放
//weak:
@property (strong, nonatomic) NSString      *keyword;

@end
//----属性传值
//1.A.xx -> B.xx

//2.A.xx -> C.xx
//  C.xx -> B.xx

//----初始化/代理  方法传值

//----数据持久化(将任意数据归档之后,存放进本地文件)

//关联式引用
//observer.m
#import "Observer.h"

#import "Computer.h"
@implementation Observer

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"observer init");
        self.per = [[Person alloc]init];
        self.per.keyword = self.keyword;
//        _per.computer.keyword = _per.keyword;

        _classRoom = [[ClassRoom alloc]init];
        _classRoom.keyword = _per.keyword;
        [self actionBegin];
    }
    return self;
}

- (void)actionBegin
{
    [_per walkToClassRoom:_classRoom];
//    [_per walkToClassRoom:_classRoom];

    NSLog(@"persons = %@",_classRoom.persons);
}

@end
//observer.h
#import <Foundation/Foundation.h>
#import "Person.h"
#import "ClassRoom.h"
@interface Observer : NSObject
@property (strong, nonatomic) Person        *per;
@property (strong, nonatomic) ClassRoom        *classRoom;

@property (strong, nonatomic) NSString      *keyword;
@end
#import "ClassRoom.h"

@implementation ClassRoom
- (instancetype)init
{
    self = [super init];
    if (self) {
        _persons = [NSMutableArray array];
    }
    return self;
}
@end
#import <Foundation/Foundation.h>

@interface ClassRoom : NSObject
//给ClassRoom设置一个strong mutable的Array属性
@property (strong, nonatomic) NSMutableArray *persons;//先初始化后使用
@property (strong, nonatomic) NSString      *keyword;

@end
时间: 2024-10-16 00:51:05

引用与传值的相关文章

老生常谈,传引用还是传值

问题 1.Java到底是按值传递(Call by Value),还是按引用传递(Call by Reference)? 2.如下面的代码,为什么不能进行交换? public CallBy swap2(CallBy a,CallBy b) { CallBy t = a; a = b; b = t; return b; } 3.如下面的代码,为什么能够交换成功? public int swap2(CallBy a,CallBy b) { int t = a.value; a.value = b.va

Python 函数参数引用(传值/传址)/copy/deepcopy

精简版: 传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如果是列表,字典则传址: copy使用场景:列表或字典,且内部元素为数字,字符串或元组 deepcopy使用场景:列表或字典,且内部元素包含列表或字典 完整版: 1.传值和传址的区别 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针).他们的区别是如果函数里

js 的复制和引用 (传值和传址)

复制(传值-实参):  基本类型赋值.函数参数 引用(传址-形参):  对象.数组.函数

java传递参数是传值还是传引用

这个问题,网上一查越看越迷糊,纠结完了先总结下 先看个栗子: 1 public class Example { 2  3     public void change(String str1, StringBuffer sbr1, char[] ch1, int a) { 4         str1 = "world"; 5         sbr1.append("world"); 6         ch1[0] = 'g'; 7     } 8  9    

python对象的复制问题,按值传递?引用传递?

这部分这篇博文说的很明白,转了过来 作者:winterTTr (转载请注明)http://blog.csdn.net/winterttr/article/details/2590741#0-tsina-1-71597-397232819ff9a47a7b7e80a40613cfe1 我想,这个标题或许是很多初学者的问题.尤其是像我这样的对C/C++比较熟悉,刚刚进入python殿堂的朋友们 .C/C++的函数参数的传递方式根深蒂固的影响这我们的思维--引用?传值?究竟是那种呢. 呵呵,语言的特性

他山之石,calling by share——python中既不是传址也不是传值

事情是这样的,Python里是传址还是传值令人疑惑,限于本人没有C基础,所以对大家的各类水平层次不一的解答难以确信. 第一个阶段: 在读<python基础教程第二版>的时候感到疑惑,然后群友解答(略敷衍),接着就是知乎上提问(感谢大家的热心回答,但我很晚才收到推送) 虽然是某天早晨睡不着,翻看公众号的时候看见一篇<不要再问 "Python 函数中,参数是传值,还是传引用?" 这种没有意义的问题了>的文章,初步释疑惑(但后来我觉得他的说法虽然形象,但是不准确) 第

传引用作为形参和返回值_节省参数拷贝的时间

基本的传引用概念 #include <bits/stdc++.h> using namespace std; //说出以下两个函数的区别 int& whatf(int &a,int &b) //如果不希望函数执行过程中 某变量被修改 用const限定 { a=3;b=2; return a; } int whath(int a,int b) { a=3;b=2; return a; } int main() { int a,b; whatf(a,b)++; cout&l

深入详解python传值问题及内存管理机制

在比较浅层次上我们通过说明如下问题来进一步深入了解python内存管理机制: python中到底是"传引用"还是"传值"呢??? 这个问题的回答是:看情况.有的是传值,有的是传引用. 判断的依据是看对象的可变性,而这一点又取决于对象的类型.故在python中的说法是对象可变的还是不可变的. 基本数据类型(整型及其他数据类型,字符串)及元组是不可变的,参数传递的是形参,也就是传过来的是原值的一个拷贝,在函数中改变形参的值实参不会发生变化: def func(a) 列表

java 参数传值

基本数据类型参数的传值,参数为基本数据类型 class Computer{ int add(int x,int y){ return x+y; } } public class Example4_6 { public static void main(String args[]){ Computer com = new Computer(); int m = 100; int n = 200; int result = com.add(m,n); System.out.println(resul