小编jus*_*tin的帖子

何时使用UIKIT_EXTERN vs extern

我猜我只会使用UIKIT_EXTERN,如果我的项目中有可能使用该变量的C++代码.

如果是这种情况,用UIKIT_EXTERN声明所有外部可用的常量是否安全?

为什么我不再看到这个?

visibility declaration objective-c extern

14
推荐指数
1
解决办法
5314
查看次数

使用int []运算符的3D数组C++

我是C/C++的新手,我一直在讨厌,但仍然不知道如何制作这样的"结构"

替代文字

它应该是一个使用指针的3D动态数组.

我这样开始,但卡在那里

  int x=5,y=4,z=3;
  int ***sec=new int **[x];
Run Code Online (Sandbox Code Playgroud)

知道如何使其成为y和z的静态大小就足够了;

拜托,我很感激你的帮助.

提前致谢.

c++ arrays pointers multidimensional-array dynamic-arrays

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

ARC和自动释放

autorelease用于返回的函数对象,因此调用者不会获得所有权,被调用者将来会释放该对象.

但是,ARC能够计算调用者的所有权并在使用后释放它,也就是说,它可以像C++中的智能指针一样行为.使用ARC,它可以摆脱自动释放,因为自动释放是非确定性的.

我问这个问题的原因是我确实看到返回的对象在ARC中比非ARC代码更早地调用dealloc.这让我认为ARC可以像Smart Pointer一样,并且可以使autorelease无用.这是真的还是可能的?我唯一可以考虑自动释放有用的是多线程或网络代码,因为在对象传递时计算所有权可能并不容易.

谢谢你的想法.

这是一个新的编辑,使事情清楚:

与自动释放

+ (MyClass*) myClass
{
    return [[[MyCClass alloc] init] autorelease];
}

- doSomething
{
   MyClass *obj = [MyClass myClass];
}
Run Code Online (Sandbox Code Playgroud)

使用ARC:

+ (MyClass*) myClass
{
    return [[MyCClass alloc] init]; // no autorelease
}

- doSomething
{
   MyClass *obj = [MyClass myClass];
   // insert [obj release]
}
Run Code Online (Sandbox Code Playgroud)

所以,我们真的不需要自动释放.

memory-management reference-counting objective-c ios automatic-ref-counting

13
推荐指数
4
解决办法
1万
查看次数

如何在C/Objective C中实现位数组

iOS/Objective-C:我有一大堆布尔值.

这是存储这些值的低效方法 - 当只需要一个时,每个元素至少使用8位.

我该如何优化?

c objective-c core-foundation bitarray ios

12
推荐指数
3
解决办法
9212
查看次数

NSLocking的使用总是应该包含在@ try/@中吗?

给定一个Cocoa NSLocking对象(比如一个NSLock)和一些在执行锁定时要执行的非平凡代码:

为了确保始终释放锁定,是否应始终使用以下习惯用法?

NSLock *mutex = // get lock from somewhere
@try {
    [mutex lock];
    // do non-trivial stuff
} 
@finally {
    [mutex unlock];
}
Run Code Online (Sandbox Code Playgroud)

这似乎是谨慎的(在Java中很常见),但我没有看到任何Cocoa代码这样做.

应该使用这个成语吗?为什么或者为什么不?

cocoa locking exception-handling objective-c

11
推荐指数
1
解决办法
485
查看次数

比较在Objective C中拥有私有成员的不同方法

我来自C++/Java世界,很明显如何创建私有成员.但是,我在Objective C中看到了几种方法,我想听听cons和pros

1)在.h文件中将它们声明为@private

@interface MyClass : NSObject
{
    @private
    int someMember;  
}
@end
Run Code Online (Sandbox Code Playgroud)

2)在.m文件中的接口中声明它们

@interface MyClass() {
    int someMember;  
}
@end

@implementation MyClass
@end
Run Code Online (Sandbox Code Playgroud)

3)在实施中声明它们

@implementation MyClass {
     int someMember;  
}
@end 
Run Code Online (Sandbox Code Playgroud)

什么是首选方法,为什么?我错过了其他方法吗?

objective-c private-members

11
推荐指数
1
解决办法
4447
查看次数

什么时候需要NS_RETURNS_RETAINED?

以下面的例子为例:

- (NSString *)pcen NS_RETURNS_RETAINED {
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge CFStringRef) self, NULL, (CFStringRef) @"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);
}
Run Code Online (Sandbox Code Playgroud)

把它放在NS_RETURNS_RETAINED那里是正确的吗?


另一个例子:

+ (UIImage *)resizeImage:(UIImage *)img toSize:(CGSize)size NS_RETURNS_RETAINED {
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
    [img drawInRect:...];
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resizedImage;
}
Run Code Online (Sandbox Code Playgroud)

这似乎更复杂,因为返回的UIImage是"Get"方法的结果.然而,它所获得的图形上下文是在方法的范围内创建的,所以它NS_RETURNS_RETAINED在这里也是正确的吗?


第三个例子:

@property (readonly) NSArray *places;
---
@synthesize places=_places;
---
- (NSArray *)places {
    if (_places)
        return _places;
    return [[NSArray alloc] initWithObjects:@"Unknown", nil];
}
Run Code Online (Sandbox Code Playgroud)

不知道该怎么做,因为返回的对象可以是新创建的.


还有最后一个问题; NS_RETURNS_RETAINED如果返回的对象是自动释放方法的结果,则可能不需要.所以说最后一个例子的回报被修改为

return [NSArray arrayWithObject:@"Unknown"];

什么是最佳实践呢?

memory-management reference-counting objective-c ios automatic-ref-counting

11
推荐指数
2
解决办法
3416
查看次数

具有NSOperations的iOS应用程序架构

两个月前我开始编写一个新的iPhone应用程序,因此我创建了一个通用的RESTFul Web服务,它允许我拥有许多这些必要的功能,如用户身份验证,用户配置文件,友谊系统,媒体处理,消息传递系统等.在我看来,有几个用例可以将这个web服务重用于未来的iPhone应用程序.

有了这种心态,我决定为这个应用程序(以及所有未来的应用程序)编写一个静态库,处理所有繁重的工作,如媒体(图像,视频,声音)设置和处理,与Web服务通信,解析和映射的结果,处理CoreData等.

鉴于我的应用程序,有许多并行任务正在运行的情况(最坏的情况),例如用户当前更改他/她的个人资料图片,而应用程序将用户位置发送到服务器(在后台),并且新的推送通知是接收.

因此决定在NSOperation中封装每个逻辑操作(如SendUserLocation或GetCurrentFriendList)并将它们添加到serviceQueue(NSOperationQueue).

当操作成功从Web服务获得结果并且现在应该处理它时,每个操作都能够生成子任务.

替代文字

典型的ServiceManager方法如下所示

- (void)activateFriendsSync:(id)observer onSuccess:(SEL)selector {
    ELOSyncFriends *opSyncFriends  = [[ELOSyncFriends alloc] initWithSM:self];
    [self ELServiceLogger:opSyncFriends];
    [serviceQueue addOperation:opSyncFriends];
    if(observer) {
        [self registerObserver:observer selector:selector name:opSyncFriends.notificationName]; 
    }
}
Run Code Online (Sandbox Code Playgroud)

每个操作,请求(到服务器)和subTask都使用GUID作为notificationName,以在完成处理时通知父对象.如果操作中的所有内容都已完成,它会将通知发送回用户界面.

也就是说,添加和删除子任务的代码看起来像这样

- (void)removeSubTask:(NSNotification*)notification {
    ELRequest *request = (ELRequest*)[notification object];
    [subTasks removeObjectIdenticalTo:request.notificationName];
    if([subTasks count] == 0) {
         // all SubTaks done, send notification to parent
        [serviceManager.notificationCenter postNotificationName:self.notificationName object:request];
    }
}

- (NSString*)addSubTask {
    NSString* newName = [self GetUUID];
    [subTasks addObject:[newName retain]];
    [serviceManager.notificationCenter addObserver:self selector:@selector(removeSubTask:) name:newName object:nil];
    return newName;
} 

- (NSString …
Run Code Online (Sandbox Code Playgroud)

architecture iphone objective-c nsoperation nsoperationqueue

10
推荐指数
1
解决办法
2438
查看次数

如何减少iPhone应用程序的代码大小?

我的iPhone应用程序已准备好投入生产,我们希望尽可能多地填充数据.当我在为我的应用程序生成.app文件时,我看到一个名为<executable name>的文件,我假设它是已编译的代码.这大约是2.5兆美元,对于我在我的应用程序中包含的内容而言似乎很大.我应该检查什么类型的东西,以确保我的可执行文件中没有包含任何不需要的项目?

iphone optimization xcode objective-c code-size

10
推荐指数
1
解决办法
2418
查看次数

如何在iPhone SDK中列出所有文件夹及其子目录/文件?

我希望用户选择她/他的iPhone中存在的任何文件,以便将其用作电子邮件附件.为此,我想显示iPhone中存在的所有文件和文件夹的列表.但是我如何获得这些文件的列表?有没有办法获得该名单?

filesystems iphone cocoa-touch foundation ios

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