相关疑难解决方法(0)

编写Objective-C和Cocoa时使用的最佳实践是什么?

我知道HIG(这非常方便!),但是在编写Objective-C时使用了什么编程实践,更具体地说,在使用Cocoa(或CocoaTouch)时.

iphone cocoa cocoa-touch objective-c ios

346
推荐指数
31
解决办法
12万
查看次数

stringWithString中的对象所有权和NSString中的initWithString

我知道任何init ...方法都会初始化一个新对象,并且NSString stringWithString会将参数字符串的副本作为新对象.我也理解作为对象的所有者,我可以控制我分配的任何对象的释放/释放.我不明白的是什么时候我会使用stringWithString方法,因为任何以这种方式分配的局部变量都会让它的内存由NSString而不是本地类"拥有".

Kochan的"Objective in Objective C"一书(第1版)使用以下代码(参见第342-344页)来解释initWithString比stringWithString更可取,因为AddressCard类将拥有名称变量contents.另外,使用stringWithString方法重复调用setName版本时,我没有任何错误.TIA!

//header file has appropriate declarations but not included here:
#import "AddressCard.h"

@implementation AddressCard;

-(NSString *) name
{
   return name;
}

//Recommended code:
-(void) setName: (NSString *) theName
{
   [name release]
   name = [[NSString alloc] initWthString: theName];
}

//Incorrect code according to Kochan:
-(void) setName: (NSString *) theName
{
   [name release]
   name = [NSString stringWthString: theName];
}

//rest of class implementation code snipped
@end
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c

9
推荐指数
2
解决办法
2万
查看次数

我是否负责在dealloc中发布UIView的gestureRecognizers?

我已将UIGestureRecognizer附加到UIView.在dealloc期间释放这个是谁的责任?

特别:

UITapGestureRecognizer *t = 
[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)];

[self.view addGestureRecognizer:t];
[t release];
Run Code Online (Sandbox Code Playgroud)

因此,self.view目前只保留gestureRecognizer.

更新我应该更清楚.我的问题与视图dealloc方法有关.视图发布时,视图的超类是否处理gestureRecognizer的释放.我现在假设是这样的.

memory-management uigesturerecognizer ios

6
推荐指数
1
解决办法
2015
查看次数

建议初始化数组(或其他对象)的最佳方法

我在以下两种初始化方式中有点困惑.....

方式1:

- (void) myMethod{

    NSArray *myArray = [[NSArray alloc] initWithObjects:obj1,obj1,nil];
    [self setClassArray:myArray];
    [myArray release];
}
Run Code Online (Sandbox Code Playgroud)

方式2:

- (void) myMethod{

NSArray *myArray = [NSArray arrayWithObjects:obj1,obj2,nil];
[self setClassArray:myArray];
}
Run Code Online (Sandbox Code Playgroud)

在方式1中,我使用了一个alloc init方法,这是一个实例方法,因为我使用了一个alloc语句,我必须自己释放数组.

在方式2中,我使用静态方法来初始化数组,因为没有使用alloc语句,所以我不需要释放系统将处理的内存.

方式1,耗时并且如果不注意可能导致内存泄漏

方式2,写作速度更快,您不需要处理内存泄漏

但是,我仍然看到标准源代码中使用的way1比way2更常见.我不知道为什么人们这样做或者我在某个地方错了.

答案和评论是特别邀请的.请提出最好的编程习惯.

iphone memory-management initialization objective-c

2
推荐指数
1
解决办法
219
查看次数